From 9ef2e22b2beb3e8676fe4b92d2266e35607accb4 Mon Sep 17 00:00:00 2001 From: "rac61@labyrinth.cl.cam.ac.uk" Date: Thu, 3 Jul 2003 15:01:39 +0000 Subject: [PATCH] bitkeeper revision 1.263 (3f044553Casub9OwqMoobhkY4qWGpQ) Apply Composite pattern to add recursive command parsing; this allows commands to be in groups so that the user interface isn't quite so unwieldy. In order to make this sensible, rename the domain classes to indicate better what they are. --- .rootkeys | 21 ++--- .../org/xenoserver/cmdline/CommandParser.java | 73 +++++++++++------- .../src/org/xenoserver/cmdline/Main.java | 58 +++++++------- ...seDestroy.java => ParseDomainDestroy.java} | 11 ++- .../{ParseList.java => ParseDomainList.java} | 11 ++- .../{ParseNew.java => ParseDomainNew.java} | 11 ++- ...{ParseStart.java => ParseDomainStart.java} | 11 ++- .../{ParseStop.java => ParseDomainStop.java} | 11 ++- .../org/xenoserver/cmdline/ParseGroup.java | 77 +++++++++++++++++++ .../src/org/xenoserver/cmdline/ParseHelp.java | 32 ++------ ...Destroy.java => CommandDomainDestroy.java} | 6 +- ...ommandList.java => CommandDomainList.java} | 6 +- ...{CommandNew.java => CommandDomainNew.java} | 6 +- ...mandStart.java => CommandDomainStart.java} | 6 +- ...ommandStop.java => CommandDomainStop.java} | 6 +- 15 files changed, 220 insertions(+), 126 deletions(-) rename tools/control/src/org/xenoserver/cmdline/{ParseDestroy.java => ParseDomainDestroy.java} (66%) rename tools/control/src/org/xenoserver/cmdline/{ParseList.java => ParseDomainList.java} (77%) rename tools/control/src/org/xenoserver/cmdline/{ParseNew.java => ParseDomainNew.java} (90%) rename tools/control/src/org/xenoserver/cmdline/{ParseStart.java => ParseDomainStart.java} (64%) rename tools/control/src/org/xenoserver/cmdline/{ParseStop.java => ParseDomainStop.java} (64%) create mode 100644 tools/control/src/org/xenoserver/cmdline/ParseGroup.java rename tools/control/src/org/xenoserver/control/{CommandDestroy.java => CommandDomainDestroy.java} (89%) rename tools/control/src/org/xenoserver/control/{CommandList.java => CommandDomainList.java} (95%) rename tools/control/src/org/xenoserver/control/{CommandNew.java => CommandDomainNew.java} (98%) rename tools/control/src/org/xenoserver/control/{CommandStart.java => CommandDomainStart.java} (88%) rename tools/control/src/org/xenoserver/control/{CommandStop.java => CommandDomainStop.java} (88%) diff --git a/.rootkeys b/.rootkeys index 2938a7a6f3..ce245516ba 100644 --- a/.rootkeys +++ b/.rootkeys @@ -17,20 +17,21 @@ 3eb781fcabCKRogwxJA3-jJKstw9Vg tools/control/domctl.xml 3f042c35FzVap5QW0UBPnZ2ZM0l3QA tools/control/src/org/xenoserver/cmdline/CommandParser.java 3eb781fdNQvEJW3tNvovjqoN7GlePA tools/control/src/org/xenoserver/cmdline/Main.java -3f042c35-TPgpCQViIaJzLts2-CnBw tools/control/src/org/xenoserver/cmdline/ParseDestroy.java +3f042c35-TPgpCQViIaJzLts2-CnBw tools/control/src/org/xenoserver/cmdline/ParseDomainDestroy.java +3f042c35h9GAWRu7wimPjBpCi09nUA tools/control/src/org/xenoserver/cmdline/ParseDomainList.java +3f042c359mRNaxBYXFwVsmv5-J_DJA tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java +3f042c35bMvqLB4Yc-0Dxs4WlYHHpw tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java +3f042c35Lc-JegNavF6Bj6coM486Ig tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java 3f042c35UhRkvblwKSx0KW2QHUn3Fw tools/control/src/org/xenoserver/cmdline/ParseFailedException.java +3f0445524oTSyogDGmCAyKMM665Rxg tools/control/src/org/xenoserver/cmdline/ParseGroup.java 3f042c35Inw0LzkOzXo9ncbEHZzUHA tools/control/src/org/xenoserver/cmdline/ParseHelp.java -3f042c35h9GAWRu7wimPjBpCi09nUA tools/control/src/org/xenoserver/cmdline/ParseList.java -3f042c359mRNaxBYXFwVsmv5-J_DJA tools/control/src/org/xenoserver/cmdline/ParseNew.java -3f042c35bMvqLB4Yc-0Dxs4WlYHHpw tools/control/src/org/xenoserver/cmdline/ParseStart.java -3f042c35Lc-JegNavF6Bj6coM486Ig tools/control/src/org/xenoserver/cmdline/ParseStop.java 3f042c35V-Bf3dlIe1r5mZs8ZTPSvA tools/control/src/org/xenoserver/control/Command.java -3f042c35U_4O2eovLKUgo2avPPHKUw tools/control/src/org/xenoserver/control/CommandDestroy.java +3f042c35U_4O2eovLKUgo2avPPHKUw tools/control/src/org/xenoserver/control/CommandDomainDestroy.java +3f042c3570VRwuzl94tEozOIVBycNg tools/control/src/org/xenoserver/control/CommandDomainList.java +3f042c35xVm-ucJAVdvC3acD6ZEe2Q tools/control/src/org/xenoserver/control/CommandDomainNew.java +3f042c36GqoXJJj_BvWGwBeKwEzgvg tools/control/src/org/xenoserver/control/CommandDomainStart.java +3f042c36bmZJD0xrxURD075avUlIUg tools/control/src/org/xenoserver/control/CommandDomainStop.java 3f042c35hdwL__Airzyz4HutOgGRqQ tools/control/src/org/xenoserver/control/CommandFailedException.java -3f042c3570VRwuzl94tEozOIVBycNg tools/control/src/org/xenoserver/control/CommandList.java -3f042c35xVm-ucJAVdvC3acD6ZEe2Q tools/control/src/org/xenoserver/control/CommandNew.java -3f042c36GqoXJJj_BvWGwBeKwEzgvg tools/control/src/org/xenoserver/control/CommandStart.java -3f042c36bmZJD0xrxURD075avUlIUg tools/control/src/org/xenoserver/control/CommandStop.java 3eb781fdBRXfSlWzK6GXlIQIlHFoaQ tools/control/src/org/xenoserver/control/Defaults.java 3ec41f7cQ7Ug739JBDrsVH-7KJ5MvQ tools/control/src/org/xenoserver/control/Domain.java 3eb781fdDeZEopemXIVg_ARCGKSmBw tools/control/src/org/xenoserver/control/InetAddressPattern.java diff --git a/tools/control/src/org/xenoserver/cmdline/CommandParser.java b/tools/control/src/org/xenoserver/cmdline/CommandParser.java index 3f4fc85032..e5dc21b658 100644 --- a/tools/control/src/org/xenoserver/cmdline/CommandParser.java +++ b/tools/control/src/org/xenoserver/cmdline/CommandParser.java @@ -1,5 +1,9 @@ package org.xenoserver.cmdline; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + import org.xenoserver.control.Command; import org.xenoserver.control.CommandFailedException; import org.xenoserver.control.Defaults; @@ -20,51 +24,64 @@ public abstract class CommandParser { * @throws ParseFailedException if the arguments are not suitable. * @throws CommandFailedException if the command did not execute successfully. */ - public abstract void parse(Defaults d, String args[]) throws ParseFailedException, CommandFailedException; + public abstract void parse(Defaults d, LinkedList args) + throws ParseFailedException, CommandFailedException; - /** Return the command name which will be matched on the command line. */ - public abstract String getName(); + /** Return the command name which will be matched on the command line. */ + public abstract String getName(); /** Return a usage string for this command. */ public abstract String getUsage(); /** Return the help text for this command. */ public abstract String getHelpText(); - - public String getStringParameter(String args[], char key, String def) + + /** Print a usage string for this command. */ + public void printUsage(String prefix) + { + String name = getName(); + if ( prefix != null ) + name = prefix + " " + name; + String usage = getUsage(); + while (name.length() < 16) + name = name + " "; + System.out.println(" " + name + usage); + } + + /** Prints the help text for this command. */ + public void printHelpText(LinkedList args) { - String r = getParameter (args, key); + System.out.println(getName() + " " + getUsage()); + System.out.println(); + System.out.println(getHelpText()); + } + + public String getStringParameter(List args, char key, String def) { + String r = getParameter(args, key); return (r == null) ? def : r; } - public int getIntParameter(String args[], char key, int def) - { - String r = getParameter (args, key); - return (r == null) ? def : (Integer.parseInt (r)); + public int getIntParameter(List args, char key, int def) { + String r = getParameter(args, key); + return (r == null) ? def : (Integer.parseInt(r)); } - public boolean getFlagParameter(String args[], char key) - { - String r = getParameter (args, key); + public boolean getFlagParameter(List args, char key) { + String r = getParameter(args, key); return (r == null) ? false : true; } - protected String getParameter (String args[], char key) - { - int i; + protected String getParameter(List args, char key) { String result = null; - for (i = 0; i < args.length; i ++) - { - if (args[i].startsWith("-" + key)) - { - if (args[i].length() > 2) - { - result = args[i].substring(2, args[i].length()); + Iterator i = args.iterator(); + while ( i.hasNext() ) { + String arg = (String) i.next(); + if (arg.startsWith("-" + key)) { + if (arg.length() > 2) { + result = arg.substring(2); + } else { + result = ""; } - else - { - result = ""; - } - } } + } return result; } } diff --git a/tools/control/src/org/xenoserver/cmdline/Main.java b/tools/control/src/org/xenoserver/cmdline/Main.java index a85c1923a7..b21aba57b3 100644 --- a/tools/control/src/org/xenoserver/cmdline/Main.java +++ b/tools/control/src/org/xenoserver/cmdline/Main.java @@ -1,46 +1,46 @@ package org.xenoserver.cmdline; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + import org.xenoserver.control.CommandFailedException; import org.xenoserver.control.Defaults; public class Main { - private static ParseHelp help = new ParseHelp(); - static CommandParser commands[] = + static final ParseHelp help = new ParseHelp(); + static final CommandParser domaincommands[] = + { new ParseDomainNew(), + new ParseDomainStart(), + new ParseDomainStop(), + new ParseDomainDestroy(), + new ParseDomainList() + }; + static final CommandParser commands[] = { help, - new ParseNew(), - new ParseStart(), - new ParseStop(), - new ParseDestroy(), - new ParseList() }; + new ParseGroup( "domain", domaincommands ) + }; + static final CommandParser parser = new ParseGroup( null, commands ); public static void main(String[] args) { Defaults d = new Defaults(); int ec = -1; + LinkedList arglist = new LinkedList(); + for ( int i=0; i"); } - String output = new CommandDestroy(d, domain_id, force).execute(); + String output = new CommandDomainDestroy(d, domain_id, force).execute(); if ( output != null ) System.out.println( output ); } diff --git a/tools/control/src/org/xenoserver/cmdline/ParseList.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainList.java similarity index 77% rename from tools/control/src/org/xenoserver/cmdline/ParseList.java rename to tools/control/src/org/xenoserver/cmdline/ParseDomainList.java index 72d81c5af4..193d5ac0c8 100644 --- a/tools/control/src/org/xenoserver/cmdline/ParseList.java +++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainList.java @@ -1,15 +1,18 @@ package org.xenoserver.cmdline; +import java.util.LinkedList; +import java.util.List; + import org.xenoserver.control.Command; import org.xenoserver.control.CommandFailedException; -import org.xenoserver.control.CommandList; +import org.xenoserver.control.CommandDomainList; import org.xenoserver.control.Defaults; import org.xenoserver.control.Domain; -public class ParseList extends CommandParser { +public class ParseDomainList extends CommandParser { - public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException { - CommandList list = new CommandList(d); + public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException { + CommandDomainList list = new CommandDomainList(d); String output = list.execute(); if ( output != null ) System.out.println( output ); diff --git a/tools/control/src/org/xenoserver/cmdline/ParseNew.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java similarity index 90% rename from tools/control/src/org/xenoserver/cmdline/ParseNew.java rename to tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java index 5ddfd7a3cf..bab3778fce 100644 --- a/tools/control/src/org/xenoserver/cmdline/ParseNew.java +++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java @@ -1,13 +1,16 @@ package org.xenoserver.cmdline; +import java.util.LinkedList; +import java.util.List; + import org.xenoserver.control.Command; import org.xenoserver.control.CommandFailedException; -import org.xenoserver.control.CommandNew; +import org.xenoserver.control.CommandDomainNew; import org.xenoserver.control.Defaults; -public class ParseNew extends CommandParser { +public class ParseDomainNew extends CommandParser { - public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException { + public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException { String name = getStringParameter(args, 'n', d.domainName); int size = getIntParameter(args, 'k', d.domainSizeKB); String image = getStringParameter(args, 'i', d.domainImage); @@ -24,7 +27,7 @@ public class ParseNew extends CommandParser { d.describe(); - CommandNew c = new CommandNew(d, name, size, image, initrd, vifs, + CommandDomainNew c = new CommandDomainNew(d, name, size, image, initrd, vifs, bargs, root_dev, nfs_root_path, nw_ip, nw_gw, nw_mask, nw_nfs_server, nw_host); c.execute(); diff --git a/tools/control/src/org/xenoserver/cmdline/ParseStart.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java similarity index 64% rename from tools/control/src/org/xenoserver/cmdline/ParseStart.java rename to tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java index 435e36a1f2..b615907d1e 100644 --- a/tools/control/src/org/xenoserver/cmdline/ParseStart.java +++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java @@ -1,20 +1,23 @@ package org.xenoserver.cmdline; +import java.util.LinkedList; +import java.util.List; + import org.xenoserver.control.Command; import org.xenoserver.control.CommandFailedException; -import org.xenoserver.control.CommandStart; +import org.xenoserver.control.CommandDomainStart; import org.xenoserver.control.Defaults; -public class ParseStart extends CommandParser { +public class ParseDomainStart extends CommandParser { - public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException { + public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException { int domain_id = getIntParameter(args, 'n', 0); if (domain_id == 0) { throw new ParseFailedException("Expected -n"); } - String output = new CommandStart(d, domain_id).execute(); + String output = new CommandDomainStart(d, domain_id).execute(); if ( output != null ) System.out.println( output ); } diff --git a/tools/control/src/org/xenoserver/cmdline/ParseStop.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java similarity index 64% rename from tools/control/src/org/xenoserver/cmdline/ParseStop.java rename to tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java index 30aeadbdec..40bc152f58 100644 --- a/tools/control/src/org/xenoserver/cmdline/ParseStop.java +++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java @@ -1,20 +1,23 @@ package org.xenoserver.cmdline; +import java.util.LinkedList; +import java.util.List; + import org.xenoserver.control.Command; import org.xenoserver.control.CommandFailedException; -import org.xenoserver.control.CommandStop; +import org.xenoserver.control.CommandDomainStop; import org.xenoserver.control.Defaults; -public class ParseStop extends CommandParser { +public class ParseDomainStop extends CommandParser { - public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException { + public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException { int domain_id = getIntParameter(args, 'n', 0); if (domain_id == 0) { throw new ParseFailedException("Expected -n"); } - String output = new CommandStop(d, domain_id).execute(); + String output = new CommandDomainStop(d, domain_id).execute(); if ( output != null ) System.out.println( output ); } diff --git a/tools/control/src/org/xenoserver/cmdline/ParseGroup.java b/tools/control/src/org/xenoserver/cmdline/ParseGroup.java new file mode 100644 index 0000000000..1903dc4b2d --- /dev/null +++ b/tools/control/src/org/xenoserver/cmdline/ParseGroup.java @@ -0,0 +1,77 @@ +package org.xenoserver.cmdline; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import org.xenoserver.control.CommandFailedException; +import org.xenoserver.control.Defaults; + +public class ParseGroup extends CommandParser { + private final String name; + private final CommandParser[] commands; + + /** + * Constructor for ParseGroup. + * @param name Name of this group of commands + * @param commands Array of commands to include + */ + public ParseGroup(String name, CommandParser[] commands) { + this.name = name; + this.commands = commands; + } + + public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException { + int i; + String c = (String) args.removeFirst(); + for (i = 0; i < commands.length; i++) { + if (commands[i].getName().equals(c)) { + if (getFlagParameter(args, '?')) { + commands[i].printHelpText(null); + } else { + commands[i].parse(d, args); + } + break; + } + } + if (i == commands.length) { + throw new ParseFailedException("Unknown command " + c); + } + } + + public String getName() { + return name; + } + + public String getUsage() { + // TODO Auto-generated method stub + return null; + } + + public String getHelpText() { + // TODO Auto-generated method stub + return null; + } + + public void printUsage(String prefix) { + if ( prefix == null ) + prefix = name; + else + prefix += " " + name; + for ( int i=0; i